package com.oraking.android.cmm.util;

import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;

import com.oraking.android.cmm.R;

/**
 * 파일명          : DatePickDialog.java 
 * 작성일          : 2011. 10. 17.
 * 작성자          : KimKyungHwan
 * Todo      : 날짜를 선택할 수 있는 Dialog를 호출하는 클래스
 * 수정내용
 * -------------------------------------------------------------
 *      수정일      |      수정자      |              수정내용              
 * -------------------------------------------------------------
 *              |              |
 */
public class DatePickDialog {

	private final CmmStrUtil cmmStrUtil = CmmStrUtil.getInstance();
	private final Context mContext;
	private final Calendar mCalendar;

	private boolean textSet;
	private EditText textField;
	private TextView textView;

	private String selectedDateStr; // 선택된 날짜를 저장하는 변수

	private final OnDateSetListener datePicker = new OnDateSetListener() {

		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			String y; // 년
			String m; // 월
			String d; // 일

			y = String.valueOf(year);
			m = String.valueOf(monthOfYear);
			d = String.valueOf(dayOfMonth);

			y = cmmStrUtil.lPad(y, 4, "0"); // 년도가 항상 4자리가 되로록 설정
			m = cmmStrUtil.lPad(m, 2, "0"); // 월이 항상 2자리가 되도록 설정
			d = cmmStrUtil.lPad(d, 4, "0"); // 일이 항상 2자리가 되도록 설정

			selectedDateStr = y + "." + m + "." + d; // 날짜 저장 변수에 저장

		}
	};

	public DatePickDialog(Context mContext, Calendar mCalendar) {
		this.mContext = mContext;
		this.mCalendar = mCalendar;
	}

	public DatePickDialog(Context mContext, Calendar mCalendar,
			EditText textField) {
		this.mContext = mContext;
		this.mCalendar = mCalendar;
		this.textField = textField;
	}

	public DatePickDialog(Context mContext, Calendar mCalendar,
			TextView textView) {
		this.mContext = mContext;
		this.mCalendar = mCalendar;
		this.textView = textView;
	}
	
	/**
	 * @title  : 
	 * @location : com.oraking.android.cmm.util.customview.DatePickDialog.getDatePickerDialog
	 * @writeDay : 2011. 10. 17. 오전 11:32:05
	 * @Todo  : 새로운 날짜 선택 Dialog 를 생성한다.
	 */
	public DatePickerDialog getDatePickerDialog() {
		DatePickerDialog dlg = new DatePickerDialog(mContext, datePicker, mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH));
		
		
		// 기존 날짜가 설정되어 있는지 확인 Start
		int year = 0, monthOfYear = 0, dayOfMonth = 0;
		if(textView != null || textField != null){
			String[] exDatas = null;
			if (textView != null) exDatas = textView.getText().toString().split("-");
			if (textField != null) exDatas = textField.getText().toString().split("-");
			
			if (exDatas.length == 3) {
				year = Integer.parseInt(exDatas[0]);
				monthOfYear = Integer.parseInt(exDatas[1])-1;
				dayOfMonth = Integer.parseInt(exDatas[2]);
				mCalendar.set(year, monthOfYear, dayOfMonth);
				dlg.updateDate(year, monthOfYear, dayOfMonth);
				
			}
		}
		// 기존 날짜가 설정되어 있는지 확인 End
		
		return dlg;
	}
	
	/**
	 * @title  : 
	 * @location : com.oraking.android.cmm.util.customview.DatePickDialog.show
	 * @writeDay : 2011. 10. 17. 오전 11:42:28
	 * @Todo  : 생성된 날짜선택 다이얼로그를 호출함.<br>
	 *          getDatePickerDlg() 메소드는 호출할 필요 없음.
	 */
	public void show() {
		DatePickerDialog dlg = getDatePickerDialog();
		
		dlg.setOnCancelListener(new DialogInterface.OnCancelListener() {
			
			@Override
			public void onCancel(DialogInterface dialog) {
				return;
			}
		});
		
		dlg.setButton3(mContext.getString(R.string.messagebox_del), new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				if(textSet){
					if(textView != null){
						textView.setText("");
					}
					if(textField != null){
						textField.setText("");
					}
				}
			}
		});
		
		dlg.show();
	}
	
	
	/**
	 * @title  : 
	 * @location : com.oraking.android.cmm.util.customview.DatePickDialog.getDate
	 * @writeDay : 2011. 10. 17. 오전 11:51:08
	 * @Todo  : 날짜선택 다이얼로그에서 선택된 날짜를 문자열 형태로 받아온다.<br>
	 *          문자열은 '2011.8.30'과 같은 형식이므로 String.split(".") 메소드를 사용하면 간편히 날짜를 년월일로 나눌 수 있음.<br>
	 *          날짜선택 다이얼로그를 호출하지 않은 상태에서 이 메소드를 호출하면 오늘의 날짜가 리턴됨.
     * @return : 콤마('.')로 구분된 yyyy/m/dd 형식의 날짜 - 예) 2011.8.30
	 */
	public String getDate() {
		return selectedDateStr;
	}
	
	/**
	 * @title  : 
	 * @location : com.oraking.android.cmm.util.DatePickDialog.parseDate
	 * @writeDay : 2011. 10. 17. 오후 3:29:34
	 * @Todo  : '2011년 8월 30일'과 같은 날짜 형식을 대시('-')로 구분된 문자열로 변환. 예)2011-08-30
	 * @return 띄어쓰기로 구분된 문자열
	 */
	public String parseDate(String date) {
		StringBuilder builder = new StringBuilder("");
		Pattern ptn;
		Matcher matcher;
		
		String nums[] = date.split(" ");
		
		for (int i=0; i<nums.length; i++) {
			String data = nums[i];
			
			switch (i) {
			case 0 :
				ptn = Pattern.compile("([0-9]*)년");
				matcher = ptn.matcher(data);
				if (matcher.find()) builder.append(matcher.group(1));
				break;
				
			case 1 :
				ptn = Pattern.compile("([0-9]*)월");
				matcher = ptn.matcher(data);
				if (matcher.find()) {
					String str = matcher.group(1);
					if (str.length() == 1)
						builder.append("-0"+str);
					else if (str.length() == 2)
						builder.append("-"+str);
				}
				break;
				
			case 2 :
				ptn = Pattern.compile("([0-9]*)일");
				matcher = ptn.matcher(data);
				if (matcher.find()) {
					String str = matcher.group(1);
					if (str.length() == 1)
						builder.append("-0"+str);
					else if (str.length() == 2)
						builder.append("-"+str);
				}
			default:
				break;
			}
		}
		
		return builder.toString();
	}
}
